﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Marmat.Forms.Skin
{
    partial class TreeView
    {
        private TreeNode selectedNode;

        /// <summary>
        /// 获取或设置控件的背景色。
        /// </summary>
        [DefaultValue(typeof(Color), "White")]
        public override Color BackColor { get => base.BackColor; set => base.BackColor = value; }

        /// <summary>
        /// 获取或设置绘制控件的模式。
        /// </summary>
        [DefaultValue(TreeViewDrawMode.Normal)]
        [Category("行为")]
        [Description("控制系统或用户是否绘制节点。")]
        public TreeViewDrawMode DrawMode { get; set; } = TreeViewDrawMode.Normal;

        /// <summary>
        /// 获取或设置连接的节点的线条的颜色。
        /// </summary>
        [DefaultValue(typeof(Color), "Black")]
        [Category("行为")]
        [Description("获取或设置连接的节点的线条的颜色。")]
        public Color LineColor { get; set; } = Color.Black;

        /// <summary>
        /// 获取或设置树视图控件中每个树节点的高度。
        /// </summary>
        [Category("外观")]
        [Description("获取或设置树视图控件中每个树节点的高度。")]
        public int ItemHeight
        {
            get
            {
                if (itemHeight == -1)
                    return this.Font.Height;
                return itemHeight;
            }
            set => itemHeight = value;
        }

        /// <summary>
        /// 获取鼠标所在的节点。
        /// </summary>
        [Browsable(false)]
        public TreeNode MouseMoveNode { get; set; }

        /// <summary>
        /// 获取或设置每个子树节点级别的缩进距离。
        /// </summary>
        [Localizable(true)]
        [DefaultValue(19)]
        [Category("行为")]
        [Description("获取或设置每个子树节点级别的缩进距离。")]
        public int Indent { get; set; } = 19;

        /// <summary>
        /// 获取分配给树视图控件的树节点集合。
        /// </summary>
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [Localizable(true)]
        [MergableProperty(false)]
        [Category("行为")]
        [Description("TreeView 控件的根节点。")]
        public TreeNodeCollection Nodes
        {
            get
            {
                if (nodes is null)
                {
                    nodes = new TreeNodeCollection();
                    nodes.treeView = this;
                }
                return nodes;
            }
        }

        /// <summary>
        /// 获取或设置一个值，用以指示当鼠标指针移过树节点标签时，树节点标签是否具有超链接的外观。
        /// </summary>
        /// <remarks>true 如果树节点标签的超链接的外观将鼠标指针移过;否则为 false。 默认值为 false。</remarks>
        [DefaultValue(false)]
        [CategoryAttribute("行为")]
        [DescriptionAttribute("指示当鼠标移到节点上时,节点是否提供反馈。")]
        public bool HotTracking { get; set; }

        /// <summary>
        /// 获取或设置一个值，用以指示选定的树节点是否即使在树视图已失去焦点时仍会保持突出显示。
        /// </summary>
        /// <remarks>true 如果未突出显示选定的树节点通过在树视图已失去焦点，则否则为 false。 默认值为 true。</remarks>
        [DefaultValue(true)]
        [CategoryAttribute("行为")]
        [DescriptionAttribute("当控件没有焦点时从选定节点移除突出显示。")]
        public bool HideSelection { get; set; } = true;

        /// <summary>
        /// 获取或设置一个值，用以指示是否在树视图控件中的树节点旁显示复选框。
        /// </summary>
        [DefaultValue(false)]
        [CategoryAttribute("外观")]
        [DescriptionAttribute("是否在节点旁显示复选框。")]
        public bool CheckBoxes { get; set; }

        /// <summary>
        /// 获取或设置一个值，用以指示是否在树视图根处的树节点之间绘制连线。
        /// </summary>
        /// <remarks>true 如果在树视图中; 根处的树节点之间绘制线条否则为 false。 默认值为 true。</remarks>
        [DefaultValue(true)]
        [CategoryAttribute("行为")]
        [DescriptionAttribute("指示是否在根节点之间显示连线。")]
        public bool ShowRootLines { get; set; } = true;

        /// <summary>
        /// 获取或设置树节点路径所使用的分隔符串。
        /// </summary>
        /// <remarks>分隔符串树节点 System.Windows.Forms.TreeNode.FullPath 属性使用。 默认值为反斜杠字符 (\)。</remarks>
        [DefaultValue("\\")]
        [CategoryAttribute("行为")]
        [DescriptionAttribute("用于由节点的FullPath属性返回的路径的字符串分隔符。")]
        public string PathSeparator { get; set; } = "\\";

        /// <summary>
        /// 获取或设置一个值，用以指示是否在包含子树节点的树节点旁显示加号 (+) 和减号 (-) 按钮。
        /// </summary>
        /// <remarks>true 如果在包含子树节点; 的树节点旁显示加号和减号按钮否则为 false。 默认值为 true。</remarks>
        [DefaultValue(true)]
        [CategoryAttribute("行为")]
        [DescriptionAttribute("指示是否在父节点旁边显示加/减按钮。")]
        public bool ShowPlusMinus { get; set; } = true;

        /// <summary>
        /// 获取或设置一个值，用以指示是否在树视图控件中的树节点之间绘制连线。
        /// </summary>
        /// <remarks>true 如果在树视图控件; 中的树节点之间绘制线条否则为 false。 默认值为 true。</remarks>
        [DefaultValue(true)]
        [CategoryAttribute("行为")]
        [DescriptionAttribute("指示是否在同级节点之间以及父节点和子节点之间显示连线。")]
        public bool ShowLines { get; set; } = true;

        /// <summary>
        /// 获取或设置当前在树视图控件中选定的树节点。
        /// </summary>
        /// <remarks>System.Windows.Forms.TreeNode 当前选定的树视图控件中。</remarks>
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [CategoryAttribute("外观")]
        public TreeNode SelectedNode
        {
            get => selectedNode;
            set
            {
                selectedNode = value;
                this.Invalidate();
            }
        }
    }
}
